#pragma once

#include <initguid.h>
#include <ObjBase.h>

// {9D22C477-5F05-435e-8193-918E791C1842}
DEFINE_GUID(CLSID_IMultInterface, 0x9d22c477, 0x5f05, 0x435e, 0x81, 0x93, 0x91, 0x8e, 0x79, 0x1c, 0x18, 0x42);

// {7F50CAF0-D978-4e96-A663-5E1FB67EDBB9}
DEFINE_GUID(IID_IMultInterface, 0x7f50caf0, 0xd978, 0x4e96, 0xa6, 0x63, 0x5e, 0x1f, 0xb6, 0x7e, 0xdb, 0xb9);

// {2995819F-1BEF-4f67-8026-E4A49D24A4D1}
DEFINE_GUID(IID_IBase, 0x2995819f, 0x1bef, 0x4f67, 0x80, 0x26, 0xe4, 0xa4, 0x9d, 0x24, 0xa4, 0xd1);

// {9F16BB3D-1DFB-4f9b-B4AD-7B33D88A98A2}
DEFINE_GUID(IID_ISub1, 0x9f16bb3d, 0x1dfb, 0x4f9b, 0xb4, 0xad, 0x7b, 0x33, 0xd8, 0x8a, 0x98, 0xa2);

// {2033B2FD-2A25-4fe3-8154-C89C11E564E2}
DEFINE_GUID(IID_ISub2, 0x2033b2fd, 0x2a25, 0x4fe3, 0x81, 0x54, 0xc8, 0x9c, 0x11, 0xe5, 0x64, 0xe2);

#undef INTERFACE
#define INTERFACE IBase
DECLARE_INTERFACE_(INTERFACE, IUnknown)
{
    STDMETHOD(QueryInterface)(THIS_ REFIID, void **) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Sum)(THIS_ LONG, LONG, LONG *) PURE;
};

#undef INTERFACE
#define INTERFACE ISub1
DECLARE_INTERFACE_(INTERFACE, IUnknown)
{
    STDMETHOD(QueryInterface)(THIS_ REFIID, void **) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(ShowMessage)(THIS_ BSTR) PURE;
};

#undef INTERFACE
#define INTERFACE ISub2
DECLARE_INTERFACE_(INTERFACE, IUnknown)
{
    STDMETHOD(QueryInterface)(THIS_ REFIID, void **) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Increment)(THIS) PURE;
    STDMETHOD(Decrement)(THIS) PURE;
    STDMETHOD(GetValue)(THIS_ LONG *) PURE;
};
